package utils

import (
	"fmt"
	"net"

	"github.com/oschwald/geoip2-golang"
)

// IPLocation IP地理位置信息
type IPLocation struct {
	Country  string `json:"country"`
	Province string `json:"province"`
	City     string `json:"city"`
}

// GetIPLocation 根据IP地址获取地理位置信息
func GetIPLocation(ip string) (*IPLocation, error) {
	// 验证IP地址格式
	if net.ParseIP(ip) == nil {
		return nil, fmt.Errorf("无效的IP地址: %s", ip)
	}

	// 打开GeoIP2数据库文件
	// 注意：需要下载GeoIP2数据库文件(.mmdb)并放置在指定路径
	db, err := geoip2.Open("GeoLite2-City.mmdb")
	if err != nil {
		return nil, fmt.Errorf("无法打开GeoIP2数据库: %v", err)
	}
	defer db.Close()

	// 解析IP地址
	ipAddr := net.ParseIP(ip)
	if ipAddr == nil {
		return nil, fmt.Errorf("无法解析IP地址: %s", ip)
	}

	// 查询地理位置信息
	record, err := db.City(ipAddr)
	if err != nil {
		return nil, fmt.Errorf("查询地理位置信息失败: %v", err)
	}

	// 构造返回结果
	location := &IPLocation{
		Country:  record.Country.Names["zh-CN"],
		Province: "",
		City:     record.City.Names["zh-CN"],
	}

	// 获取省份信息(如果可用)
	if len(record.Subdivisions) > 0 {
		location.Province = record.Subdivisions[0].Names["zh-CN"]
	}

	return location, nil
}

// GetIPLocationEN 根据IP地址获取英文地理位置信息
func GetIPLocationEN(ip string) (*IPLocation, error) {
	// 验证IP地址格式
	if net.ParseIP(ip) == nil {
		return nil, fmt.Errorf("无效的IP地址: %s", ip)
	}

	// 打开GeoIP2数据库文件
	db, err := geoip2.Open("GeoLite2-City.mmdb")
	if err != nil {
		return nil, fmt.Errorf("无法打开GeoIP2数据库: %v", err)
	}
	defer db.Close()

	// 解析IP地址
	ipAddr := net.ParseIP(ip)
	if ipAddr == nil {
		return nil, fmt.Errorf("无法解析IP地址: %s", ip)
	}

	// 查询地理位置信息
	record, err := db.City(ipAddr)
	if err != nil {
		return nil, fmt.Errorf("查询地理位置信息失败: %v", err)
	}

	// 构造返回结果
	location := &IPLocation{
		Country:  record.Country.Names["en"],
		Province: "",
		City:     record.City.Names["en"],
	}

	// 获取省份信息(如果可用)
	if len(record.Subdivisions) > 0 {
		location.Province = record.Subdivisions[0].Names["en"]
	}

	return location, nil
}
